跳到主要内容

Ubuntu 包管理器学习

参考资料 Linux 黑话解释:什么是包管理器?它是如何工作的? 参考资料 怎么理解ubuntu中的软件包管理器apt和dpkg

什么是包管理器?

先来说明一下没有包管理器是怎么安装软件的,要想在 Linux 系统中安装软件只能采取源码包的方式安装,所以需要用户自行编译源码并解决软件间的依赖关系,而且升级之类的后续操作也非常困难。

为了摆脱这种复杂性,Linux 发行版创建了自己的打包格式,为终端用户提供随时可用的二进制文件(预编译软件),以便安装软件,同时提供一些元数据(版本号、描述)和依赖关系。

几乎所有的 Linux 发行版都有 “软件仓库”,它基本上是软件包的集合。可以有不止一个软件库,软件库包含不同种类的软件包。

软件仓库也有元数据文件,其中包含了软件包的信息,如软件包的名称、版本号、软件包的描述和软件仓库名称等,系统上的包管理器就是与这个元数据进行交互来处理这些包管理的。可以使用 apt show 命令查看

apt show nginx

包管理器会在系统上创建了一个元数据的本地缓存。当运行包管理器的更新选项(例如 apt update)时,它会通过引用仓库中的元数据来更新本地元数据缓存。

当运行软件包管理器的安装命令(例如 apt install package_name)时,软件包管理器会引用这个缓存。如果它在缓存中找到了包的信息,它就会使用互联网连接到相应的仓库,并在系统上安装下载的包。

一个包可能有依赖关系。意思是说,它可能需要安装其他软件包,软件包管理器通常会自动处理这些依赖关系,并将其与正在安装的软件包一起自动安装。

软件包的分类

参考资料 Linux下软件包的分类及deb、rpm、tar.gz的区别

按类型分类

Linux 应用程序的软件包按内容类别可分为两类:

1、可执行文件(编译后的二进制软件包)

解开包后就可以直接运行的。在 Windows 中所有的软件包都是这种类型。安装完这个程序后,你就可以使用,但你看不到源程序。而且下载时要注意这个软件是否是你所使用的平台,否则将无法正常安装。

  • 优点:使用简单,只需要几个命令就可以实现包的安装、升级、查询、卸载;安装速度快;
  • 缺点:不能看源代码;功能选择不如源代码灵活;依赖性;

2、源程序(源码包)

解开包后,你还需要使用编译器将其编译成为可执行文件。这在 Windows 系统中是几乎没有的,因为 Windows 的思想是不开放源程序的。

  • 优点:开源;可以自由选择所需功能;可看源代码;卸载方便(直接删除安装位置);
  • 缺点:安装步骤过多;编译时间过长;

Linux 下软件包的格式分类

Linux 下的软件安装包主要有 rpm、deb、tar.gz 三种格式,想了解三种软件包的区别,我们先来看看 Linux 软件扩展名,通过扩展名可以了解软件格式,进而了解软件安装。

软件后缀为 .rpm 最初是 Red Hat Linux 提供的一种包封装格式,现在许多 Linux 发行版本都使用;

后缀为 .deb 是 Debain Linux 提供的一种包封装格式;

后缀为 .tar.gztar.Ztar.bz2.tgz 是使用 Unix 系统打包工具 tar 打包的;

后缀为 .bin 的一般是一些商业软件。

rpm 格式软件包

RPM 全称是 Red Hat Package Manager(Red Hat 包管理器),是由红帽公司最先发布的一种用来打包软件的的文件格式,他是一种特定的用来安装,卸载软件等操作的专门格式,它里面打包的内容必定是一个可以使用的具体软件。

RPM 本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的 Linux 软件。在红帽 LINUX、SUSE、Fedora 可以直接进行安装,但在 Ubuntu 中却无法识别。

deb 格式软件包

deb 是 Debian Linux 提供的一个包管理器,它与 RPM 十分类似。但由于 RPM 出现得早,并且应用广泛,所以在各种版本的 Linux 中都常见到,而 Debian 的包管理器 dpkg 只出现在 Debian Linux 中。它的优点是不用被严格的依赖性检查所困扰,缺点是只在 Debian Linux 发行版中才能见到这个包管理工具。

在 Ubuntu 系统中双击 deb 包就可以进入自动安装进程。

tar.gz 格式软件包

tar.gz 就是一个压缩包,类似于 win 上面的 zip 等文件,他是为了便于传输所产生的一种专门用于网络流通的文件格式,这种文件的格式与其他两种软件存在本质上的区别,比如:tar.gz 可以也是一个文本,照片等等的文件压缩在里面,并不一定是一个具体软件。

在所有的 Linux 版本中都能使用,但安装过程也最麻烦。

apt 命令学习

参考资料 apt-get命令 参考资料 怎么理解ubuntu中的软件包管理器apt和dpkg

apt 是什么?

Advanced Packaging Tool(apt)是Linux下的一款安装包管理工具,是一个客户/服务器系统。

在服务器上先复制所有 DEB 包(DEB 是 Debian 软件包格式的文件扩展名),然后用 APT 的分析工具(genbasedir)根据每个 DEB 包的包头(Header)信息对所有的 DEB 包进行分析,并将该分析结果记录在一个文件中,这个文件称为DEB 索引清单(就是上面说的那个本地源数据缓存),APT 服务器的 DEB 索引清单置于 base 文件夹内。

一旦 APT 服务器内的 DEB 有所变动,一定要使用 genbasedir 产生新的 DEB 索引清单。客户端在进行安装或升级时先要查询 DEB 索引清单,从而可以获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。

当客户端需要安装、升级或删除某个软件包时,客户端计算机取得 DEB 索引清单压缩文件后,会将其解压置放于 /var/state/apt/lists/,而客户端使用 apt-get installapt-get upgrade 命令的时候,就会将这个文件夹内的数据和客户端计算机内的 DEB 数据库比对,知道哪些 DEB 已安装、未安装或是可以升级的。

它有两个主要工具:apt-getapt-cache

apt 命令的几个缺省路径

下载的软件存放位置:/var/cache/apt/archives

安装后软件默认位置:/usr/share

可执行文件位置:/usr/bin

配置文件位置:/etc

库文件位置:/usr/lib

更新本地元数据缓存

sudo apt-get update

升级软件

使用 apt-get 升级已安装的软件包

sudo apt-get upgrade

# 要仅升级特定程序
sudo apt-get upgrade <package_name>

查看软件列表

dpkg -l # 列出当前系统中所有的包.可以和参数 less 一起使用在分屏查看.

dpkg -l | grep -i "软件包名" # 查看系统中与"软件包名"相关联的包.

搜索软件

使用 apt-cache 命令搜索包

# 只要有关的就能找的到(这玩意找的话能找出一大堆,尽量还是少用)
apt-cache search <search term>

# 只找包名相关
apt-cache pkgnames <search_term>

安装包

sudo apt-get install <package_name>

# 多个包
sudo apt-get install <package_1> <package_2> <package_3>

# 安装特定版本
sudo apt-get install <package_name>=<version_number>

删除包(卸载软件)

sudo apt-get remove <package_name>

# package 删除包,包括删除配置文件等
sudo apt-get remove --purge <package_name>

# apt-get remove 和 apt-get purge 的区别就是
# apt-get remove只删除包的二进制文件。它不会触及配置文件
# apt-get purge删除与包相关的所有内容,包括配置文件
sudo apt-get purge <package_name>


# package 删除包及其依赖的软件包配置文件等
sudo apt-get autoremove --purge <package_name>

清空本地缓存

使用 apt-get 清理系统

# 使用以下命令清除检索到的包文件的本地存储库
sudo apt-get clean


# autoclean 只删除那些现在有更新版本的检索包文件,它们将不再使用。
sudo apt-get autoclean

查看已安装的软件

apt list

# 或者

dpkg -l

dpkg 命令学习

dpkg 是什么?

Ubuntu 是基于 Debian 的 Linux 系统,而 Debian 系统的软件是使用 APT 和 dpkg 进行管理。dpkg 是 "Debian Packager" 的简写,是一个底层的软件包管理工具。

与 apt 的区别

与上面的 apt 区别是:

  • apt 是会解决和安装模块的依赖问题,并会咨询软件仓库,是在线安装。
  • dpkg 只能安装本地的 deb 文件,不会关心 Ubuntu 的软件仓库内的软件,不会解决模块的依赖关系。

且 dpkg 可以绕过 apt 包管理数据库对软件包进行操作,所以你用 dpkg 安装过的软件包用 apt 可以再安装一遍,系统不知道之前安装过了,将会覆盖之前 dpkg 的安装。

常用的 dpkg 命令

# 安装一个 Debian 软件包,如手动下载的文件。
dpkg -i package.deb

# 列出 package.deb 的内容。
dpkg -c package.deb

# 从 package.deb 中提取包信息。(来查看软件的状态)
dpkg -I package.deb

# 移除一个已安装的包。
dpkg -r package

# 完全清除一个已安装的包。
# 和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。
dpkg -P package

# 列出 package 安装的所有文件清单。
dpkg -L package

# 显示已安装包的信息。
dpkg -s package

# 重新配制一个已经安装的包,如果它使用的是 debconf (debconf 为包安装提供了一个统一的配置界面)。
dpkg -reconfigure package

# 查看软件在哪个包里;
dpkg -S package

检查包的路径

example

dpkg -L nghttp2

snap 包管理器

apt 所采用的包是 deb 包,deb 包最初是Debian Linux推出的。由于ubuntu基于debian,ubuntu将其集成到了apt包管理器中。apt可以自动解决软件之间依赖问题,ubuntu创建了一个类似apple store的软件商店。

总结:与 deb 包不同的是,它将依赖包打包到应用中了,可以解决之前 Linux 下各种依赖导致的问题,不过相应的,软件体积变大了,就像 win 和 mac 中傻瓜式的安装方式

常用命令

获取帮助

snap help

安装、卸载官方商店的应用:

sudo snap install <软件名>
sudo snap remove <软件名>

安装本地应用

sudo snap install --dangerous <文件名(.snap结尾)>